package iorm

import (
	"context"
	"database/sql"
	"io"
	"reflect"
)

const (
	Select SqlType = iota
	Update
	Delete
	Insert
)

type (
	// SqlType SQL类型
	SqlType int

	// FieldNewValuePool field new scan value pool
	FieldNewValuePool interface {
		Get() interface{}
		Put(interface{})
	}

	// SerializerInterface serializer interface
	SerializerInterface interface {
		Scan(ctx context.Context, field IField, dst reflect.Value, dbValue interface{}) error
		SerializerValuerInterface
	}

	// SerializerValuerInterface serializer valuer interface
	SerializerValuerInterface interface {
		Value(ctx context.Context, field IField, dst reflect.Value, fieldValue interface{}) (interface{}, error)
	}

	// SignalChan 信号
	SignalChan struct{}

	// IDialector 数据库方言
	IDialector interface {
		Name() string                                     // 返回数据库名称
		Initialize(db IDatabase) error                    // 初始化方言
		Migrator(db IDatabase) IMigrator                  // 返回用于执行数据库迁移的IMigrator接口
		DataTypeOf(field IField) string                   // 返回 ORM 结构体字段到数据库字段的数据类型映射
		DefaultValueOf(field IField) IExpression          // 返回 ORM 结构体字段的默认值表达式
		BindVarTo(writer IWriter, stmt IStatement, v any) // 将绑定变量的值写入 SQL 语句
		QuoteTo(IWriter, string)                          // 引用字段名或表名的字符串写入 SQL 语句
		Explain(sql string, vars ...any) string           // 返回一个解释（explain）查询计划的 SQL 语句
	}

	IWriter interface {
	}

	IExpression interface {
	}

	IField interface {
	}

	IStatement interface {
	}

	ISchema interface{}

	// Namer namer interface
	Namer interface {
		TableName(table string) string
		SchemaName(table string) string
		ColumnName(table, column string) string
		JoinTableName(joinTable string) string
		CheckerName(table, column string) string
		IndexName(table, column string) string
	}

	// IMigrator 数据库迁移抽象接口
	IMigrator interface {
	}

	// IDatabase 数据库
	IDatabase interface {
		Pool(pool IConnPool)
		Conn() IConnPool
	}

	// IConnPool 数据库连接池
	IConnPool interface {
		// PrepareContext 创建一个预处理语句
		PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
		// ExecContext 执行指定的 SQL 语句并返回一个 sql.Result 对象, 用于执行不返回行的 SQL 语句，例如 INSERT、UPDATE 或 DELETE
		ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
		// QueryContext 执行指定的查询并返回一个 sql.Rows 对象。用于执行 SELECT 查询，返回多行结果
		QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
		// QueryRowContext 执行指定的查询并返回一个 sql.Row 对象。用于执行 SELECT 查询，期望返回单行结果
		QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
	}

	// ISession 执行事务会话
	ISession interface {
	}

	// IPlugin GORM plugin interface
	IPlugin interface {
		Name() string
		Initialize(db IDatabase) error
	}

	// IMapper 读取mapper文件
	IMapper interface {
		ReadMapper(read io.Reader) error
	}

	// IDynamicSql 动态SQL解析
	IDynamicSql interface {
		Parse(types SqlType, sqlId string, vars ...any) (sql string, params []any, err error)
	}

	IOrm interface {
	}
)
